// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraCharacterWithAbilities.h"
// 包含对应的头文件

#include "AbilitySystem/Attributes/LyraCombatSet.h"
// 包含战斗属性集的头文件
#include "AbilitySystem/Attributes/LyraHealthSet.h"
// 包含生命值属性集的头文件
#include "AbilitySystem/LyraAbilitySystemComponent.h"
// 包含Lyra能力系统组件的头文件
#include "Async/TaskGraphInterfaces.h"
// 包含异步任务图接口的头文件

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraCharacterWithAbilities)
// UE宏，用于包含内联生成的C++代码

// 构造函数实现
ALyraCharacterWithAbilities::ALyraCharacterWithAbilities(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)  // 调用父类构造函数
{
	// 创建默认的子对象：能力系统组件
	AbilitySystemComponent = ObjectInitializer.CreateDefaultSubobject<ULyraAbilitySystemComponent>(this, TEXT("AbilitySystemComponent"));
	
	// 设置能力系统组件为可复制的
	AbilitySystemComponent->SetIsReplicated(true);
	
	// 设置复制模式为混合模式
	AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);

	// 创建生命值属性集默认子对象
	CreateDefaultSubobject<ULyraHealthSet>(TEXT("HealthSet"));
	
	// 创建战斗属性集默认子对象
	CreateDefaultSubobject<ULyraCombatSet>(TEXT("CombatSet"));

	// 设置网络更新频率为100Hz，因为能力系统组件需要高频更新
	NetUpdateFrequency = 100.0f;
}

// PostInitializeComponents方法实现
void ALyraCharacterWithAbilities::PostInitializeComponents()
{
	Super::PostInitializeComponents();  // 调用父类的实现

	check(AbilitySystemComponent);  // 断言检查能力系统组件是否有效
	
	// 初始化能力系统组件的actor信息，设置拥有者和头像都为this（角色自身）
	AbilitySystemComponent->InitAbilityActorInfo(this, this);
}

// 获取能力系统组件方法实现
UAbilitySystemComponent* ALyraCharacterWithAbilities::GetAbilitySystemComponent() const
{
	return AbilitySystemComponent;  // 返回能力系统组件指针
}